package com.nowcoder.community.controller.advice;

import com.nowcoder.community.util.GenerateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.resource.HttpResource;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @BelongsProject: community
 * @BelongsPackage: com.nowcoder.community.controller.advice
 * @Author: Master_XXJS
 * @CreateTime: 2023-01-03  13:32
 * @Description: TODO
 * @Version: 1.0
 */
//所有的  带有 @Controller 注解的 Bean 都会被扫描，请求报错的时候进行处理
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {

    //避免这个 类 出现异常错误，记录日记，其实就是 slf4j
    private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);

    /**
     * 发生异常就进行执行
     * @param e 异常对象
     * @param request
     * @param response
     */
    //所有的 异常 类型都进行捕获，  xxx.class 就是捕获什么类型的异常
    @ExceptionHandler(Exception.class)
    public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
        logger.error("服务器发生异常：" + e.getMessage());
        //获取异常的信息栈
        for (StackTraceElement stack : e.getStackTrace()){
            logger.error(stack.toString());
        }

        //判断请求的方式，获取请求的 请求头，区分 是 前端进行跳转页面还是后端进行跳转
        String xRequestedWith = request.getHeader("x-requested-with");
        //xml 相关的就是 异步请求，前后端分离
        if ("XMLHttpRequest".equals(xRequestedWith)) {
            // plain——就是归属前端返回的是  普通的字符串，如果需要的json，需要手动进行转换
            // json---就是告诉前端返回的是  json字符串
            response.setContentType("application/plain;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.write(GenerateUtil.getJsonString(1, "服务器异常!"));
        } else {
            //普通的请求，直接进行重定向，后端自己进行跳转页面
            //直接跳转的是 500
            //因为404的话，路径根本不存在， 所以无法访问到 controller，也就是controller不可能报错，所以无法触发这里
            response.sendRedirect(request.getContextPath() + "/error");
        }
    }
}

